package cn.springboot.linked;
/**
 * @author liufl E-mail:Huberier@allpyra.com
 * @version 创建时间：2017年9月27日 下午4:30:34
 * 类说明
 */
import java.util.HashSet;
import java.util.Set;

import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;

public class HtmlNodeParser {
    /**
     * 解析url地址中对应的页面中的a标签与frame标签
     * @throws ParserException 
     * 
     */
    public Set<String> parseNode(String url,NodeFilter filter) throws ParserException{      //NodeFilter表明是否要全网爬行
        Set<String> set=new HashSet<String>();
        Parser parser=new Parser(url);
        if(!url.startsWith("http:/")){
            url="http:/"+url;
        }
        //这个过滤器用户过滤frame
        NodeFilter framefilter=new NodeFilter(){

            @Override
            public boolean accept(Node node) {
                if(node.getText().indexOf("frame src=")>=0){
                    return true;
                }else{
                    return false;
                }
            }

        };
        //创建过滤器     LinkTag表示超链接标记
        OrFilter linkFilter=new OrFilter(new NodeClassFilter(LinkTag.class),framefilter);

        NodeList list=parser.extractAllNodesThatMatch(linkFilter);

        for(int i=0;i<list.size();i++){
            Node node=list.elementAt(i);
            String linkurl=null;
            if(node instanceof LinkTag){    //href
                LinkTag linkTag=(LinkTag) node;
                linkurl=linkTag.getLink();


            }else{
                //是frame节点 src
                String frame=node.getText();
                int start=frame.indexOf("src=");
                frame=frame.substring(start);
                int end=frame.indexOf(" ");
                if(end==-1){
                    end=frame.indexOf(">");
                }
                linkurl=frame.substring(4,end-1);
            }
            if(linkurl==null||"".equals(linkurl)||(!linkurl.startsWith("http://")&&!linkurl.startsWith("https://"))){
                continue;
            }
            if(  filter!=null&&filter.accept(node)==false){
                continue;
            }


            set.add(linkurl);
        }
        return set;
    }
}

